package javao.cn.work.orc.utils.pdf;

import javao.cn.work.orc.common.exception.OrcException;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;


/**
 * @Description PDF转换为图片工具类
 * @Author Admin小闫
 * @Date 2024/12/2
 */
@Component
@Slf4j
public class PdfUtils {


    /**
     * 转换全部的pdf
     * @param inputStream 文件输入流
     * @return 包含所有页面图像的映射，键为页码（从0开始），值为对应的BufferedImage
     */
    public Map<Integer, BufferedImage> pdf2png(InputStream inputStream) {
        // 使用 try-with-resources 确保 PDDocument 在使用后被关闭
        try (PDDocument doc = PDDocument.load(inputStream)) {
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            Map<Integer, BufferedImage> imageMap = new HashMap<>();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 300); // Windows native DPI
                imageMap.put(i, image);
            }
            return imageMap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 转换全部的pdf到文件夹【本地测试用】
     */
    public static Map<Integer, BufferedImage> pdf2png(File file, String type) {
        try {
            PDDocument doc = PDDocument.load(file,type);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            Map<Integer,BufferedImage> imageMap = new HashMap<>();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 300); // Windows native DPI
                ImageIO.write(image, type, new File("./test/"+i+"."+type));
                imageMap.put(i,image);
            }
            return imageMap;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 将PDF文件转换为图片，并允许指定起始和结束页码。
     *
     * @param fileAddress 文件所在的目录地址（用于日志信息）
     * @param filename PDF文件名
     * @param indexOfStart 开始转换的页码，从0开始
     * @param indexOfEnd 停止转换的页码，-1表示全部转换
     * @return 包含所有转换页面图像的映射，键为页码（从0开始），值为对应的BufferedImage
     */
    public Map<Integer, BufferedImage> pdf2png(String fileAddress, String filename, int indexOfStart, int indexOfEnd) {
        File file = new File(fileAddress + File.separator + filename);
        if (!file.exists() || !file.canRead()) {
            System.err.println("无法读取文件: " + file.getAbsolutePath());
            return null;
        }

        // 验证页码范围
        if (indexOfStart < 0 || (indexOfEnd != -1 && indexOfEnd <= indexOfStart)) {
            System.err.println("无效的页码范围: [" + indexOfStart + ", " + indexOfEnd + "]");
            return null;
        }

        Map<Integer, BufferedImage> imageMap = new HashMap<>();

        // 使用 try-with-resources 确保 PDDocument 在使用后被关闭
        try (PDDocument doc = PDDocument.load(file)) {
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();

            // 如果结束页是 -1 或者超出实际页数，则设置为最后一页
            if (indexOfEnd == -1 || indexOfEnd >= pageCount) {
                indexOfEnd = pageCount - 1;
            }
            if (indexOfStart >= pageCount) {
                throw new OrcException("起始页超出PDF总页数");

            }

            for (int i = indexOfStart; i <= indexOfEnd; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 300); // Windows native DPI
                imageMap.put(i, image);
                throw new OrcException("已转换第 " + (i + 1) + " 页到内存");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return imageMap;
    }
}
